package com.cspm.common.core;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.github.pagehelper.StringUtil;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * 扩展Jackson提供的ObjectMapper类
 * Created by CHQIU on 2017-04-17.
 */
public class CustomJacksonObjectMapper extends ObjectMapper {
    /**
     * 是否将驼峰转为下划线
     */
    private boolean camelCaseToLowerCaseWithUnderscores = false;

    /**
     * 进行日期格式化
     */
    private String dateFormatPattern = null;

    /**
     * 序列换成json时,将所有的long变成string，处理Long类型转Json后精度丢失问题
     */
    private boolean longToString = false;

    /**
     * 是否将驼峰转为下划线
     *
     * @param camelCaseToLowerCaseWithUnderscores 是否将驼峰转为下划线
     * @author CHENQUAN
     * @date 2016年11月23日
     */
    public void setCamelCaseToLowerCaseWithUnderscores(
            boolean camelCaseToLowerCaseWithUnderscores) {
        this.camelCaseToLowerCaseWithUnderscores = camelCaseToLowerCaseWithUnderscores;
    }

    /**
     * 进行日期格式化
     */
    public void setDateFormatPattern(String dateFormatPattern) {
        this.dateFormatPattern = dateFormatPattern;
    }

    /**
     * @param longToString 是否将Long转为String
     * @author CHENQUAN
     * @date 2016年11月23日
     */
    public void setLongToString(boolean longToString) {
        this.longToString = longToString;
    }

    public void init() {

        // 排除值为空属性
        setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // 进行缩进输出
        configure(SerializationFeature.INDENT_OUTPUT, true);

        // 将驼峰转为下划线
        if (camelCaseToLowerCaseWithUnderscores) {
            setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        }

        // 进行日期格式化
        if (StringUtil.isNotEmpty(dateFormatPattern)) {
            DateFormat dateFormat = new SimpleDateFormat(dateFormatPattern);
            setDateFormat(dateFormat);
        }

        /** 序列换成json时,将所有的long变成string ，处理Long类型转Json后精度丢失问题 */
        if (longToString) {
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
            registerModule(simpleModule);
        }
    }
}
